﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Portfolio.IViews.Admin;
using Portfolio.Presenters.Admin;
using Portfolio.Entities;
using Portfolio.BL.Common;
using Portfolio.BL.Dictionary;
using Portfolio.IViews.Common;
using Portfolio.UI.Common;
using System.Data;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace Portfolio.UI.Admin.Controls
{
    /// <summary>
    /// Klasa programowa kontrolka użytkownika.
    /// Odpowiedzialna za wykonywanie operacji i wyświetlanie wszystkich kategorii artykułów. 
    /// </summary>
    public partial class AdminArticleCategoriesGridControl : System.Web.UI.UserControl, IAdminArticleCategoriesView
    {
        int _articleCategoryID;
        int _maxSeqArticleCategory;
                
        /// <summary>
        /// Metoda programowa page.
        /// Podczas ładowania, uruchamia zdarzenia i wyświetla komunikaty o błędach. 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Load(object sender, EventArgs e)
        {
           if (!Page.IsPostBack)
            {
                if (LoadArticleCategoriesSortBySearch != null)
                {
                    LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
                }

                if (LoadFieldsSearch != null)
                {                    
                    LoadFieldsSearch(this, EventArgs.Empty);       
                }                
            }            
            
            if (MySession.Current.MessageError != null)
            {
                PublishException = MySession.Current.MessageError;
                MySession.Current.MessageError = null;
            }

            if (MySession.Current.InformationSuccess != null)
            {
                divInformationSuccess.Visible = true;
                lblInforamtionSuccess.Text = MySession.Current.InformationSuccess;
                MySession.Current.InformationSuccess = null;
            }

            if (MySession.Current.InformationNotice != null)
            {
                divInformationSuccess.Visible = true;
                lblInforamtionSuccess.Text = MySession.Current.InformationNotice;
                MySession.Current.InformationNotice = null;
            }           
                    
        }

        /// <summary>
        /// Metoda programowa gridview.
        /// Wykonuje operacje na przyciskach na gridzie.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvCategories_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            ImageButton imgbtn;

            switch (e.CommandName.ToLower())
            {
                case "imgbtnedit":
                    imgbtn = (ImageButton)e.CommandSource;
                    Response.Redirect("~/Admin/AdminEditArticleCategory.aspx?articleCategoryId=" + Convert.ToInt32(imgbtn.CommandArgument));

                    break;

                case "imgbtndelete":
                    imgbtn = (ImageButton)e.CommandSource;
                    this._articleCategoryID = Convert.ToInt32(imgbtn.CommandArgument);
                    if (DeleteArticleCategory != null)
                    {
                        DeleteArticleCategory(this, EventArgs.Empty);
                    }
                    if (LoadArticleCategoriesSortBySearch != null)
                    {
                        LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
                    }
                    if (LoadFieldsSearch != null)
                    {
                        LoadFieldsSearch(this, EventArgs.Empty);
                    }  
                    break;

                case "imgbtnup":
                    imgbtn = (ImageButton)e.CommandSource;
                    this._articleCategoryID = Convert.ToInt32(imgbtn.CommandArgument);
                    if (SetUpSeq != null)
                    {
                        SetUpSeq(this, EventArgs.Empty);
                    }
                    if (LoadArticleCategoriesSortBySearch != null)
                    {
                        LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
                    }
                    if (LoadFieldsSearch != null)
                    {
                        LoadFieldsSearch(this, EventArgs.Empty);
                    }
                    break;

                case "imgbtndown":
                    imgbtn = (ImageButton)e.CommandSource;
                    this._articleCategoryID = Convert.ToInt32(imgbtn.CommandArgument);
                    if (SetDownSeq != null)
                    {
                        SetDownSeq(this, EventArgs.Empty);
                    }
                    if (LoadArticleCategoriesSortBySearch != null)
                    {
                        LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
                    }
                    if (LoadFieldsSearch != null)
                    {
                        LoadFieldsSearch(this, EventArgs.Empty);
                    } 
                    break;
            }
        }

        /// <summary>
        /// Metoda programowa GridView.
        /// Opdowiedzialna za stronnicowanie grida.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvListCategories_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvListCategories.PageIndex = e.NewPageIndex;
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa DropDownList
        /// Odpowiedzialna za wyświetlanie ilości wierszy na gridzie.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
        {
            gvListCategories.PageSize = Convert.ToInt32(ddlPageSize.SelectedItem.Text);
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa GridView
        /// Odpowiedzialna za sortowanie malejąco lub rosnąco wg kolumny 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvListCategories_Sorting(object sender, GridViewSortEventArgs e)
        {

            if (this.SortExpression == e.SortExpression)
            {
                if (this.SortDirection == "Ascending")
                {
                    e.SortDirection = System.Web.UI.WebControls.SortDirection.Descending;
                    this.SortDirection = "Descending";
                }
                else
                {
                    e.SortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
                    this.SortDirection = "Ascending";
                }
            }
            else
            {
                e.SortDirection = System.Web.UI.WebControls.SortDirection.Ascending;
                this.SortDirection = "Ascending";
            }
            this.SortExpression = e.SortExpression;
        }

        /// <summary>
        /// Metoda programowa GridView.
        /// Odpowiedzialna za wyświetlanie strzałek na kolumnach grida.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvListCategories_Sorted(object sender, EventArgs e)
        {
            //add current sorting state mark           

            foreach (DataControlField field in ((GridView)sender).Columns)
            {
                // strip off the old ascending/descending icon                      
                Regex r = new Regex(@"\s(\u25bc|\u25b2)");
                field.HeaderText = r.Replace(field.HeaderText, "");

                if (field.SortExpression != null && field.SortExpression == this.SortExpression)
                {
                    if (this.SortDirection == "Ascending")
                    {
                        field.HeaderText += " \u25b2";
                    }
                    else
                    {
                        field.HeaderText += " \u25bc";
                    }
                }
            }

            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa Button.
        /// Odpowiedzialna za całościowe przeszukiwanie grida.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa DropDownList
        /// Odpowiedzialna za przeszukiwanie grida wg kategorii nadrzędnych
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlCategories_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa DropDownList
        /// Odpowiedzialna za przeszukiwanie grida wg statusu kategorii
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlStatus_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa DropDownList
        /// Odpowiedzialna za przeszukiwanie grida wg widoczności kategorii
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlActive_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa ImageButton.
        /// Odpowiedzialna za usuwanie zaznaczonych kategorii.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void imgbtnDeleteChecked_Click(object sender, EventArgs e)
        {
            foreach (GridViewRow row in gvListCategories.Rows)
            {
                CheckBox _cbTemp = row.FindControl("cbSelect") as CheckBox;
                if (_cbTemp.Checked == true)
                {
                    this._articleCategoryID = Convert.ToInt32(_cbTemp.Text);
                    if (DeleteArticleCategory != null)
                    {
                        DeleteArticleCategory(this, EventArgs.Empty);
                        ////IsCategoryDel = false;
                       // IsCategoryDelSel = true;
                    }
                }
            }
            if (LoadArticleCategoriesSortBySearch != null)
            {
                LoadArticleCategoriesSortBySearch(this, EventArgs.Empty);
            }
            if (LoadFieldsSearch != null)
            {
                LoadFieldsSearch(this, EventArgs.Empty);
            }
        }

        /// <summary>
        /// Metoda programowa CheckBox
        /// Odpowiedzialna za zaznaczanie wszystkich kategorii w gridzie
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void cbAllSelect_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox _cbTemp = (CheckBox)sender;
            if (_cbTemp.Checked == true)
            {
                foreach (GridViewRow row in gvListCategories.Rows)
                {
                    ((CheckBox)row.FindControl("cbSelect")).Checked = true;
                }
            }
            else
            {
                foreach (GridViewRow row in gvListCategories.Rows)
                {
                    ((CheckBox)row.FindControl("cbSelect")).Checked = false;
                }
            }
        }

        /// <summary>
        /// Metoda programowa ImageButton.
        /// Odpowiedzialna za dodawanie kategorii.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void imgbtnAddCategory_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Admin/AdminEditArticleCategory.aspx");
        }

        /// <summary>
        /// Metoda programowa ImageButton.
        /// Odpowiedzialna za anulowanie strony.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void imgbtnCancel_Click(object sender, ImageClickEventArgs e)
        {
            Response.Redirect("~/Admin/AdminMain.aspx");
        }

        /// <summary>
        /// Metoda programowa GridView
        /// Odpowiedzialna za zmienianie wartości grida
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gvListCategories_RowDataBound(object sender, GridViewRowEventArgs e)
        {            
            if (e.Row.RowType == DataControlRowType.DataRow)
            {   
                switch (DataBinder.Eval(e.Row.DataItem, "Status").ToString())
                {
                    case "0":
                        e.Row.Cells[5].Text = (CommonDictionary.Instance.GetStatusDictionary())[0];
                        break;
                    case "1":
                        e.Row.Cells[5].Text =(CommonDictionary.Instance.GetStatusDictionary())[1];
                        break;
                    case "2":
                        e.Row.Cells[5].Text = (CommonDictionary.Instance.GetStatusDictionary())[2];
                        break;
                }

                if (e.Row.Cells[3].Text == "&nbsp;")
                {
                    ImageButton _imgbtnDown = (ImageButton)e.Row.Cells[4].FindControl("imgbtnDown");
                    _imgbtnDown.ImageUrl = "~/Admin/AdminTheme/img/icons/small/down_red.png";
                    ImageButton _imgbtnUp = (ImageButton)e.Row.Cells[4].FindControl("imgbtnUp");
                    _imgbtnUp.ImageUrl = "~/Admin/AdminTheme/img/icons/small/up_red.png";
                }
                else
                {
                    Label _lbl = (Label)e.Row.Cells[4].FindControl("Label1");
                    _lbl.Text = "&nbsp;&nbsp;" + _lbl.Text;
                }
                
                //_countAllRows = Int32.Parse(DataBinder.Eval(e.Row.DataItem, "ArticleCategoryID").ToString());
                _articleCategoryID = Int32.Parse(DataBinder.Eval(e.Row.DataItem, "ArticleCategoryID").ToString());

                if (SetMaxSeqArticleCategory != null)
                {
                    SetMaxSeqArticleCategory(this, EventArgs.Empty);
                }
            
                if (DataBinder.Eval(e.Row.DataItem, "SeqCategory").ToString() == "1")
                {
                    ImageButton _imgbtnUp = (ImageButton)e.Row.Cells[4].FindControl("imgbtnUp");                    
                    _imgbtnUp.Visible = false;
                }
                if (DataBinder.Eval(e.Row.DataItem, "SeqCategory").ToString() == _maxSeqArticleCategory.ToString())
                {
                    ImageButton _imgbtnDown = (ImageButton)e.Row.Cells[4].FindControl("imgbtnDown");
                    _imgbtnDown.Visible = false;
                }               

            }
        }

        /// <summary>
        /// Implementowanie publicznego Interfejsu.
        /// </summary>
        #region IAdminCategoriesView members

        public event EventHandler<EventArgs> LoadArticleCategoriesSortBySearch;
        public event EventHandler<EventArgs> LoadFieldsSearch;
        public event EventHandler<EventArgs> DeleteArticleCategory;
        public event EventHandler<EventArgs> SetMaxSeqArticleCategory;
        public event EventHandler<EventArgs> SetUpSeq;
        public event EventHandler<EventArgs> SetDownSeq;

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za ustawienie danych w gridzie 
        /// </summary>
        public IList<ArtcileCategoriesGridV> ArticleCategoriesDataBind
        {
            set
            {
                gvListCategories.DataSource = value;                
                gvListCategories.DataBind();
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za zliczenie wszystkich kategorii w rodzinie 
        /// </summary>
        public int MaxSeqArticleCategory
        {          
            set
            {
                _maxSeqArticleCategory = value;
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za ustawienie obiektu POCO ArticleCategory 
        /// </summary>
        public ArticleCategoryT ArticleCategory
        {
            get
            {
                ArticleCategoryT _articleCategory = new ArticleCategoryT();
                _articleCategory.ArticleCategoryID = _articleCategoryID;
                return _articleCategory;
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za ustawienie i odczyt stanu widoku czy zostało uruchomione sortowanie wg kolumny  
        /// </summary>
        public string SortExpression
        {
            get
            {
                if (ViewState["PreviousSortExpression"] == null)
                {
                    ViewState["PreviousSortExpression"] = "";
                }
                return (string)ViewState["PreviousSortExpression"];
            }

            set
            {
                ViewState["PreviousSortExpression"] = value;
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za ustawienie i odczyt (stan widoku) kierunek sortowania wg kolumny  
        /// </summary>
        public string SortDirection
        {
            get
            {
                if (ViewState["PreviousSortDirection"] == null)
                {
                    ViewState["PreviousSortDirection"] = "Ascending";
                }
                return (string)ViewState["PreviousSortDirection"];
            }

            set
            {
                ViewState["PreviousSortDirection"] = value;
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za odczyt pola tytuł kategorii do wyszukiwania w gridzie
        /// </summary>
        public string SearchTitle
        {
            get
            {
                return txtSearchTitle.Text;
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za odczyt pola kategoria nadrzędna do wyszukiwania w gridzie
        /// </summary>
        public int? SearchArticleCategories
        {
            get
            {
                if (string.IsNullOrEmpty(ddlCategories.SelectedValue))
                {
                    return null;
                }
                else
                {
                    return Int32.Parse(ddlCategories.SelectedValue);
                }
            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za odczyt pola widoczność kategorii do wyszukiwania w gridzie
        /// </summary>
        public bool? SearchActive
        {
            get
            {
                if (string.IsNullOrEmpty(ddlActive.SelectedValue))
                {
                    return null;
                }
                else
                {
                    return Convert.ToBoolean(Int32.Parse(ddlActive.SelectedValue));
                }

            }
        }

        /// <summary>
        /// Właściwość interfejsu.
        /// Odpowiedzialny za odczyt pola status kategorii do wyszukiwania w gridzie
        /// </summary>
        public byte? SearchStatus
        {
            get
            {
                if (string.IsNullOrEmpty(ddlStatus.SelectedValue))
                {
                    return null;
                }
                else
                {
                    return Byte.Parse(ddlStatus.SelectedValue);
                }
            }
        }        

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie i wyświetlanie an stronie pozytywnych komunikatów.
        /// </summary>
        public string PublishInformationSuccess
        {
            set
            {
                if (value != null)
                {
                    //Session["information_success"] = value;
                    divInformationSuccess.Visible = true;
                    lblInforamtionSuccess.Text = value;
                }
                else
                {
                    //Session["information_success"] = null;
                    divInformationSuccess.Visible = false;
                    lblInforamtionSuccess.Text = value;
                }

            }
        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie i wyświetlanie an stronie neutralnych komunikatów.
        /// </summary>
        public string PublishInformationNotice
        {
            set
            {
                if (value != null)
                {
                    divInformationNotice.Visible = true;
                    lblInforamtionNotice.Text = value;
                    //Session["information_notice"] = value;
                }
                else
                {
                    divInformationNotice.Visible = false;
                    lblInforamtionNotice.Text = value;
                }
            }

        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie i wyświetlanie an stronie krytycznych komunikatów.
        /// </summary>
        public string PublishException
        {
            set
            {
                if (value != null)
                {
                    this.divError.Visible = true;
                    this.valCustom.ErrorMessage = value;
                    this.valCustom.IsValid = false;                    
                    //Session["message_error"] = value;
                }                
            }
        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie danymi DropDownList kategorii nadrzędnych.
        /// </summary>
        public DataSourceContainer ArticleCategoriesDataSource
        {
            set
            {
                ddlCategories.Items.Clear();
                ddlCategories.Items.Add(new ListItem("-wybierz kat. nadrzędną-", ""));
                ddlCategories.DataSource = value.DataSource;
                ddlCategories.DataTextField = value.DataTextFieldName;
                ddlCategories.DataValueField = value.DataValueFieldName;
                ddlCategories.DataBind();
            }
        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie danymi DropDownList statusu.
        /// </summary>
        public DataSourceContainer StatusDataSource
        {
            set
            {
                ddlStatus.Items.Clear();
                ddlStatus.Items.Add(new ListItem("-wybierz status-", ""));
                ddlStatus.DataSource = value.DataSource;
                ddlStatus.DataTextField = value.DataTextFieldName;
                ddlStatus.DataValueField = value.DataValueFieldName;
                ddlStatus.DataBind();
            }
        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie danymi DropDownList aktywny (widoczność).
        /// </summary>
        public DataSourceContainer ActiveDataSource
        {
            set
            {
                ddlActive.Items.Clear();
                ddlActive.Items.Add(new ListItem("-wybierz aktywność-", ""));
                ddlActive.DataSource = value.DataSource;
                ddlActive.DataTextField = value.DataTextFieldName;
                ddlActive.DataValueField = value.DataValueFieldName;
                ddlActive.DataBind();
            }
        }

        /// <summary>
        /// Właściwość interfejsu
        /// Odpowiedzialny za ustawienie danymi DropDownList ilość stron w gridzie.
        /// </summary>
        public DataSourceContainer PageSizeDataSource
        {
            set
            {
                ddlPageSize.DataSource = value.DataSource;
                ddlPageSize.DataTextField = value.DataTextFieldName;
                ddlPageSize.DataValueField = value.DataValueFieldName;
                ddlPageSize.DataBind();
                ddlPageSize.Items.FindByValue(value.DataSelectedValue.ToString()).Selected = true;
            }
        }       
        
        #endregion        
    }
}